/*
 * Copyright (c) 2015-2999 广州朗尊软件科技有限公司<www.legendshop.cn> All rights reserved.
 *
 * https://www.legendshop.cn/
 *
 * 版权所有,并保留所有权利
 *
 */
package com.sankuai.inf.leaf.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
 * @author legendshop
 */
public class Utils {
	private static final Logger logger = LoggerFactory.getLogger(Utils.class);

	public static String getIp() {
		String ip;
		try {
			List<String> ipList = getHostAddress(null);
			// default the first
			ip = (!ipList.isEmpty()) ? ipList.get(0) : "";
		} catch (Exception ex) {
			ip = "";
			logger.warn("Utils get IP warn", ex);
		}
		return ip;
	}

	public static String getIp(String interfaceName) {
		String ip;
		interfaceName = interfaceName.trim();
		try {
			List<String> ipList = getHostAddress(interfaceName);
			ip = (!ipList.isEmpty()) ? ipList.get(0) : "";
		} catch (Exception ex) {
			ip = "";
			logger.warn("Utils get IP warn", ex);
		}
		return ip;
	}

	/**
	 * 获取已激活网卡的IP地址
	 *
	 * @param interfaceName 可指定网卡名称,null则获取全部
	 * @return List<String>
	 */
	private static List<String> getHostAddress(String interfaceName) throws SocketException {
		List<String> ipList = new ArrayList<String>(5);
		Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
		while (interfaces.hasMoreElements()) {
			NetworkInterface ni = interfaces.nextElement();
			Enumeration<InetAddress> allAddress = ni.getInetAddresses();
			while (allAddress.hasMoreElements()) {
				InetAddress address = allAddress.nextElement();
				if (address.isLoopbackAddress()) {
					// skip the loopback addr
					continue;
				}
				if (address instanceof Inet6Address) {
					// skip the IPv6 addr
					continue;
				}
				String hostAddress = address.getHostAddress();
				if (null == interfaceName) {
					ipList.add(hostAddress);
				} else if (interfaceName.equals(ni.getDisplayName())) {
					ipList.add(hostAddress);
				}
			}
		}
		return ipList;
	}
}
